package com.dkd.manage.service.impl;

import java.util.List;
import java.util.ArrayList;
import com.dkd.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dkd.manage.mapper.VendingMachineMapper;
import com.dkd.manage.mapper.VmTypeMapper;
import com.dkd.manage.mapper.NodeMapper;
import com.dkd.manage.mapper.ChannelMapper;
import com.dkd.manage.domain.VendingMachine;
import com.dkd.manage.domain.VmType;
import com.dkd.manage.domain.Node;
import com.dkd.manage.domain.Channel;
import com.dkd.manage.service.IVendingMachineService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 设备管理Service业务层处理
 *
 * @author ruoyi
 * @date 2025-11-10
 */
@Service
public class VendingMachineServiceImpl implements IVendingMachineService
{
    @Autowired
    private VendingMachineMapper vendingMachineMapper;

    @Autowired
    private VmTypeMapper vmTypeMapper;

    @Autowired
    private NodeMapper nodeMapper;

    @Autowired
    private ChannelMapper channelMapper;

    /**
     * 查询设备管理
     *
     * @param id 设备管理主键
     * @return 设备管理
     */
    @Override
    public VendingMachine selectVendingMachineById(Long id)
    {
        return vendingMachineMapper.selectVendingMachineById(id);
    }

    /**
     * 查询设备管理列表
     *
     * @param vendingMachine 设备管理
     * @return 设备管理
     */
    @Override
    public List<VendingMachine> selectVendingMachineList(VendingMachine vendingMachine)
    {
        return vendingMachineMapper.selectVendingMachineList(vendingMachine);
    }

    /**
     * 新增设备管理
     *
     * 实现功能：
     * 1. 选择设备类型和点位后，自动生成设备编号
     * 2. 根据设备类型的货道行列数，批量创建对应的货道记录
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertVendingMachine(VendingMachine vendingMachine)
    {
        // 1. 获取设备类型信息
        VmType vmType = vmTypeMapper.selectVmTypeById(vendingMachine.getVmTypeId().longValue());
        if (vmType == null) {
            throw new RuntimeException("设备类型不存在");
        }

        // 2. 获取点位信息
        Node node = nodeMapper.selectNodeById(vendingMachine.getNodeId());
        if (node == null) {
            throw new RuntimeException("点位不存在");
        }

        // 3. 自动生成设备编号（格式：V + 类型ID + 时间戳后6位）
        String autoCode = "V" + vendingMachine.getVmTypeId() + System.currentTimeMillis() % 1000000;
        vendingMachine.setInnerCode(autoCode);

        // 4. 设置冗余信息
        vendingMachine.setAddr(node.getAddress());
        vendingMachine.setBusinessType(node.getBusinessType().intValue());
        vendingMachine.setRegionId(node.getRegionId());
        // TODO: 需要从点位关联查询区域名称和合作商名称
        // vendingMachine.setRegionName(node.getRegionName());
        // vendingMachine.setPartnerId(node.getPartnerId());
        // vendingMachine.setPartnerName(node.getPartnerName());
        vendingMachine.setVmTypeName(vmType.getName());
        vendingMachine.setChannelMaxCapacity(vmType.getChannelMaxCapacity());
        vendingMachine.setLastSupplyTime(DateUtils.parseDate("2000-01-01"));

        // 5. 设置创建时间
        vendingMachine.setCreateTime(DateUtils.getNowDate());
        vendingMachine.setUpdateTime(DateUtils.getNowDate());

        // 6. 保存设备
        int result = vendingMachineMapper.insertVendingMachine(vendingMachine);

        // 7. 获取插入后的设备ID
        Long vmId = vendingMachine.getId();

        // 8. 批量创建货道记录
        List<Channel> channels = generateChannels(vmId, autoCode, vmType);
        int channelCount = vendingMachineMapper.batchInsertChannels(channels);

        return result;
    }

    /**
     * 修改设备管理
     *
     * 实现功能：
     * 同步更新从点位表获取的冗余地址、区域、合作商等信息
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateVendingMachine(VendingMachine vendingMachine)
    {
        // 1. 获取点位信息
        Node node = nodeMapper.selectNodeById(vendingMachine.getNodeId());
        if (node == null) {
            throw new RuntimeException("点位不存在");
        }

        // 2. 同步更新冗余信息
        vendingMachine.setAddr(node.getAddress());
        vendingMachine.setBusinessType(node.getBusinessType().intValue());
        vendingMachine.setRegionId(node.getRegionId());
        // TODO: 需要从点位关联查询区域名称和合作商名称
        // vendingMachine.setRegionName(node.getRegionName());
        // vendingMachine.setPartnerId(node.getPartnerId());
        // vendingMachine.setPartnerName(node.getPartnerName());
        vendingMachine.setNodeName(node.getNodeName());

        // 3. 如果设备类型发生变化，更新设备类型信息
        if (vendingMachine.getVmTypeId() != null) {
            VmType vmType = vmTypeMapper.selectVmTypeById(vendingMachine.getVmTypeId().longValue());
            if (vmType != null) {
                vendingMachine.setVmTypeName(vmType.getName());
                vendingMachine.setChannelMaxCapacity(vmType.getChannelMaxCapacity());
            }
        }

        // 4. 设置更新时间
        vendingMachine.setUpdateTime(DateUtils.getNowDate());

        // 5. 更新设备信息
        int result = vendingMachineMapper.updateVendingMachine(vendingMachine);

        // 6. 同步更新冗余信息到设备表
        // （如果在其他地方修改了点位信息，这里会同步更新）
        vendingMachineMapper.updateByNodeId(
            vendingMachine.getNodeId(),
            vendingMachine.getAddr(),
            vendingMachine.getRegionId(),
            vendingMachine.getRegionName(),
            vendingMachine.getPartnerId(),
            vendingMachine.getPartnerName()
        );

        return result;
    }

    /**
     * 批量删除设备管理
     *
     * @param ids 需要删除的设备管理主键
     * @return 结果
     */
    @Override
    public int deleteVendingMachineByIds(Long[] ids)
    {
        return vendingMachineMapper.deleteVendingMachineByIds(ids);
    }

    /**
     * 删除设备管理信息
     *
     * @param id 设备管理主键
     * @return 结果
     */
    @Override
    public int deleteVendingMachineById(Long id)
    {
        return vendingMachineMapper.deleteVendingMachineById(id);
    }

    /**
     * 根据设备类型生成货道记录
     *
     * @param vmId 设备ID
     * @param innerCode 设备编号
     * @param vmType 设备类型
     * @return 货道列表
     */
    private List<Channel> generateChannels(Long vmId, String innerCode, VmType vmType)
    {
        List<Channel> channels = new ArrayList<>();

        // 根据设备类型的行列数生成货道
        int rows = vmType.getVmRow();
        int cols = vmType.getVmCol();
        int maxCapacity = vmType.getChannelMaxCapacity();

        for (int row = 1; row <= rows; row++) {
            for (int col = 1; col <= cols; col++) {
                Channel channel = new Channel();
                // 生成货道编号：格式为 设备编号-行号-列号 (例如: V10001-1-1)
                channel.setChannelCode(innerCode + "-" + row + "-" + col);
                channel.setVmId(vmId);
                channel.setInnerCode(innerCode);
                channel.setMaxCapacity(maxCapacity);
                channel.setCurrentCapacity(0); // 初始容量为0
                channel.setLastSupplyTime(DateUtils.parseDate("2000-01-01")); // 初始补货时间
                channel.setCreateTime(DateUtils.getNowDate());
                channel.setUpdateTime(DateUtils.getNowDate());

                channels.add(channel);
            }
        }

        return channels;
    }
}